/*
 * @Author: wangwei wwdqq7@qq.com
 * @Date: 2025-03-30 18:03:01
 * @LastEditors: wangwei wwdqq7@qq.com
 * @LastEditTime: 2025-03-31 13:29:33
 * @FilePath: /FullStack/lint/eslint-plugin-smarts/src/eslint-plugin-smarts.ts
 * @Description: --
 */

import { ESLint } from 'eslint';
import annotation from 'eslint-plugin-annotation';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import unusedImports from 'eslint-plugin-unused-imports';
import vue from 'eslint-plugin-vue';

export default {
  /*
   * ------------------------------------------------------------------------------
   *  Plugin Definition
   * ------------------------------------------------------------------------------
   */

  /*
   * import all rules in lib/rules
   */
  // rules: requireIndex(`${__dirname}/rules`),
  // rules: [],
  configs: {
    recommended: {
      rules: {
        // 数组/对象排序
        'annotation/sort': 2,
        'annotation/sort-keys': 2,
        'annotation/format-date': 2,
        'annotation/unique': 2,

        // 移除无用的代码
        '@typescript-eslint/no-unused-vars': 'off',
        'no-unused-vars': 'off', // or "@typescript-eslint/no-unused-vars": "off",
        'unused-imports/no-unused-imports': 'error',
        'unused-imports/no-unused-vars': [
          'warn',
          {
            vars: 'all',
            varsIgnorePattern: '^_',
            args: 'after-used',
            argsIgnorePattern: '^_',
          },
        ],

        // 排序
        // 'simple-import-sort/imports': 'error',
        'simple-import-sort/exports': 'error',
        'simple-import-sort/imports': [
          'error',
          {
            groups: [
              // react放在首行
              ['^react', '^vue', '^ant-design-vue', '^@?\\w'],

              // 内部导入
              ['^(@|components)(/.*|$)'],

              // 父级导入. 把 `..` 放在最后.
              ['^\\.\\.(?!/?$)', '^\\.\\./?$'],

              // 同级导入. 把同一个文件夹.放在最后
              ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'],

              // 样式导入.
              ['^.+\\.?(css)$'],

              // 带有副作用导入，比如import 'a.css'这种.
              ['^\\u0000'],
            ],
          },
        ],

        /**
         * @description: vue2生命周期顺序
         * [vue](https://eslint.vuejs.org/rules/)
         * https://www.freesion.com/article/35501016814/
         */

        'vue/order-in-components': [
          'error',
          {
            order: [
              'el',
              'name',
              'key',
              'parent',
              'functional',
              ['delimiters', 'comments'],
              ['components', 'directives', 'filters'],
              'extends',
              'mixins',
              ['provide', 'inject'],
              'ROUTER_GUARDS',
              'layout',
              'middleware',
              'validate',
              'scrollToTop',
              'transition',
              'loading',
              'inheritAttrs',
              'model',
              ['props', 'propsData'],
              'emits',
              'setup',
              'fetch',
              'asyncData',
              'data',
              'head',
              'computed',
              'watch',
              'watchQuery',
              'LIFECYCLE_HOOKS',
              'methods',
              ['template', 'render'],
              'renderError',
            ],
          },
        ],

        /**
         * other
         */
        /*
         * 要求使用 let 或 const 而不是 var
         */
        'no-var': 'error',

        /*
         * 禁止使用console
         */
        'no-console': 'off',

        /*
         * 禁止使用debugger
         */
        'no-debugger': 'error',

        /*
         * 禁止使用alert confirm prompt
         */
        'no-alert': 'error',

        /*
         * 禁止空余的多行
         * 'no-unexpected-multiline': 'error',
         */

        /*
         * 禁止不必要的转义字符
         * 'no-useless-escape': 'off',
         */

        /*
         * 禁止使用数组构造器
         * 'no-array-constructor': 'off',
         */

        /*
         * 禁止使用call和apply函数
         * 'no-caller': 'off',
         */

        /*
         * 禁止catch子句参数与外部作用域变量同名
         * 'no-catch-shadow': 'off',
         */

        /*
         * 允许catch语句在未绑定异常的处理程序时抛出异常，但不允许覆盖处理程序或抛出新的异常。
         * 'no-catch-shadow': 0,
         */

        /*
         * 禁止在类的方法中使用本地的类名称作为标识符
         * 'no-class-assign': 'off',
         */

        /*
         * 华为规范
         * 规则11 注释和上面代码块要有空行，和注释之间要有一个空格
         */

        'lines-around-comment': [
          'warn',
          {
            beforeBlockComment: true,
            afterBlockComment: false,
            beforeLineComment: true,
            afterLineComment: false,
            allowBlockStart: true, // 允许在块开始处的注释不需要前置空行
            allowBlockEnd: false,
            allowObjectStart: true, // 允许在对象开始处的注释不需要前置空行
            allowObjectEnd: false,
            allowArrayStart: true, // 允许在数组开始处的注释不需要前置空行
            allowArrayEnd: false,
            allowClassStart: true, // 允许在类开始处的注释不需要前置空行
            allowClassEnd: false,
            ignorePattern: '\\s*@\\w+', // 忽略带有 @xxx 注解的注释
          },
        ],

        /*
         * 华为规范
         */
        // 规则9 一般单行注释用//, 块注释用/* */, 文档注释用/** */--要求或禁止在注释前有空白
        'spaced-comment': ['error', 'always'],

        /*
         * 基于华为JAVASCRIPT编码规范规则集
         * 建议21 圈复杂度不超过10
         */

        complexity: ['warn', { max: 10 }],
      },
      plugins: {
        annotation: annotation,
        'unused-imports': unusedImports,
        'simple-import-sort': simpleImportSort,
        vue,
      },
      languageOptions: {
        globals: {
          uni: 'writable',
          process: 'writeable',
          __POWERED_BY_QIANKUN__: 'writeable',
        },
        parserOptions: {
          ecmaVersion: 'latest',
          sourceType: 'module',
        },
      },
    },
  },
} satisfies ESLint.Plugin;
